package kotlindemo.com.kotlindemo

//第一行代码第二章语法
fun main(args: Array<String>) {
//    println("Hello Kotlin");
//    println(getScore("Tom"))
//    checkNumber(0.2)
    //------------------------------------循环
    val range = 0..10
    for (i in range step 2) {
        println(i)
    }
    //------------------------------------降序
    for (i in 10 downTo 1) {
        println(i)
    }
    //------------------------------------Lambda表达式
    /**
     * Lambda是一段可以作为参数传递的代码，语法结构为
     * {参数名1：参数类型，参数名2：参数类型 ->函数体}
     */
    //----------------------------------------map函数
    //map函数是常用的一种函数式API，它用于将集合中的每个元素都映射成一个另外的值，
    // 映射的规则在Lambda表达式中指定，最终生成一个新的集合
    var list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
    val newList = list.map { it.toUpperCase() }
    //filter函数
    val newList2 = list.filter { it.length <= 5 }
            .map { it.toUpperCase() }
    //any all函数
    //是否存在一个长度小于5的元素
    val anyResult = list.any { it.length <= 5 }
    //是否所有元素的长度都小于5
    val allResult = list.all { it.length <= 5 }
    for (fruit in newList) {
        println(fruit)
    }
    //------------------------------------let函数的用法
    //let函数主要用法就是帮助?.语法进行辅助判空处理
    //？代表可为空
    //？.代表不为空执行后面代码，为空则不执行任何操作
    //？：代表不为空执行？：前面的代码，为空则执行？：后面的代码
    //!! 代表我已经确认这里不为空了，不需要编译器帮我判断，强制非空判断的意思
    var student = Student();
    doStudy(student)
    //------------------------------------let函数的简化用法
    doStudy1(student)
    //------------------------------------字符串内嵌表达式，当变量只有一个时，大括号可以去掉
    val name = "Tom"
    println("hello $name nice to meet you")
}

//顶层方法
fun getScore(name: String) = when (name) {//when语句允许传入任意类型的语句
    "Tom" -> 86
    "Jim" -> 96
    "Jerry" -> 50
    "Jack" -> 90
    else -> 0
}

fun checkNumber(num: Number) {
    when (num) {
        is Int -> println("传入的数字是Int")
        is Double -> println("传入的数字是Double")
        else -> print("啥都不是")
    }
}

fun doStudy(study: Student?) {
    study?.let { stu ->
        stu.doHomeWork()
        stu.goToSchool()
    }

}

fun doStudy1(study: Student?) {
    study?.let {
        it.doHomeWork()
        it.goToSchool()
    }
}